#!/bin/bash
# set -x
# 超全局变量
SCRIPTDIR=`cd $(dirname $0);pwd`
CWD=`pwd`

source $SCRIPTDIR/libs/helper.sh

# recon2 方案
# 1. 使用全局数组存储 pandoc 选项，pandoc var(-V)， pandoc meta(-M)，pandoc filter（--lua-filter）以及panbook需要的变量
#    1.1 通过--option=value形式传入的panbook不能识别的参数存储到 pandoc var数组中，扔给pandoc（需要处理repeat for multiple options的情况）
#    1.2 repeat处理方式为：传参时结尾加 __ , 如 --bibliography__=abc.bib 表示这是一个repeat参数
# 2. panbook选项及每个模块的patch可以修改，新增或删除这些全局数组的元素
# 3. 新增函数用于拼接参数，执行pandoc时调用
# 4. 设计扩展机制：style patch修改参数，执行每个扩展目录下的脚本
# 5. 重定义名词及目录
#    5.1: templates 专指pandoc模板（--templates选项），和 风格（styles） 区分
#    5.2: extensions 用于扩展功能，extension添加的全局变量应以 ext_ 开头。扩展.extensions中设置全局变量前应检查是否以及存在，并打印帮助信息（允许用户通过-G选项更改全局变量）
#    5.3: styles 风格，设计样式，用于定制某种模板，可以通过patch调用extension，修改全局变量，改变模板，增加lua filter等。（参数名 --style）
#         5.3.1: styles和templates要做区分，比如默认的latex模板，moderncv，elegantbook都可以调用这个模板，但是又需要不同的lua filter,文档类等

declare -A _G         # panbook全局选项
declare -A _P         # pandoc选项
declare -A _V         # pandoc var (-V)
declare -A _M         # pandoc meta (-M)
declare -A _F         # lua filter (--lua-filter)
declare -A _F0        # 需要在crossref及citeproc前执行的lua filter
declare -A _MF        # parse metadata.yml

# ${_G[header]} 变量说明：
# 由于pandoc-crossref需要使用metadata中的header-includes变量，命令行参数中不能包含 -H，需要使用lua filter将-H参数内容转换为metadata变量
# 参见 https://github.com/annProg/PanBook/issues/8
# -H 参数引入的tex文件，命名为 add-header-*.tex，pandoc执行前，cat add-header-*.tex > add-header.tex
_G=(
	[func-pre]=func                                                   # 可被命令行调用的function前缀
	[src]=src                                                         # 默认src目录名称（需要在获取参数后重置）
	[workdir]=$CWD/src                                                # 默认markdown源码目录（需要在获取参数后重置）
	[imgdir]=$CWD/src/images                                          # 默认image目录（需要在获取参数后重置）
	[crs]=$SCRIPTDIR/crs/zh-CN.yaml                                   # 默认crs配置文件（需要在获取参数后重置）
	[ofile]=`echo $CWD |awk -F '/' '{print $NF}'`                     # 默认输出文件名
	[build]=$CWD/build                                                # 默认编译目录
	[moduledir]=modules
	[fontdir]=fonts
	[extdir]=extensions                                               # 扩展目录
	[tpldir]=templates                                                # pandoc模板目录
	[styledir]=styles                                                 # styles目录
	[stylecv]=styles/cv
	[styleslide]=styles/slide
	[stylebook]=styles/book
	[stylethesis]=styles/thesis
	[styleart]=styles/article
	[scriptdir]=$SCRIPTDIR
	[cwd]=$CWD
	[convert]=convert
	[debug]=false
	[trace]=false
	[frontmatter]=frontmatter.md                                      # 前言部分单独放到一个文件中是考虑到前言应在目录前，通过 -B 参数引入，才能实现
	[backmatter]=backmatter.md
	[defaultbody]=100-body.md
	[v]=""
	[m]=""
	[p]=""
	[f]=""
	[crossref]="-F pandoc-crossref"
	[citeproc]="-F pandoc-citeproc"
	[pandoc-param]=""
	[t]=tex
	[interaction]="-interaction=batchmode"
	[xelatex]=""
	[part]=false                                                      # 部分编译
	[highlight]=""                                                    # 高亮样式
)
_G[build_id]=`echo $RANDOM$RANDOM$RANDOM`                             # 表示编译ID
_G[header]=$CWD/build/add-headers-${_G[build_id]}.tex                 # 默认header文件名 build_id支持并行编译

_P=(
	[toc]=""
	[csl]=$SCRIPTDIR/csl/chinese-gb7714-2005-numeric.csl              # 默认cls文件路径（需要在获取参数后重置）
	[bibliography]=$CWD/src/bibliography.bib                          # 默认bibliography路径（需要在获取参数后删除）
	[metadata-file]=$CWD/src/metadata.yaml                            # 默认metadata.yaml（需要在获取参数后重置）	
	[pdf-engine]=xelatex
	[number-sections]=""
)
_V=(
	[indent]=true                                                     # indent M默认打开
)
_M=(
	[link-citations]=true                                             #  make your citations hyperlinks to the corresponding bibliography entries
)
_F=()

# 存储帮助信息
declare -A _H
_H=()

# 引入函数和模块
source $SCRIPTDIR/libs/core.sh
source $SCRIPTDIR/libs/functions.sh
loadModules

if [ $# -ge 1 ];then
	[ "$1"x == "--help"x -o "$1"x == "-h"x -o "$1"x == "help"x ] && printhelp
	_G[function]=$1
	shift
else
	printhelp
fi

loadExtensions

for i in "$@"
do
	key=$1
	case $key in
	-h|--help)
		_help ${_G[function]} $2
		exit 0;;
	-l|--list)
		_list ${_G[function]} $2
		exit 0;;
	--style=*)
		_G[style]=${key#*=}
		shift;;
	--crs=*)
		_G[crs]=${key#*=}
		shift;;		
	-d|--debug)
		_G[debug]=true
		shift;;
	--src=*)
		_G[src]=${key#*=}
		shift;;
	--imgdir=*)
		_G[imgdir]=${key#*=}
		shift;;		
	--part=*)
		_G[part]=${key#*=}
		shift;;
	--ci=*)
		_G[ci]=${key#*=}
		useCI ${_G[ci]}
		shift;;
	--memory=*)
		_G[memory]=${key#*=}
		shift;;
		# 限制内存使用 see https://github.com/jgm/pandoc/issues/3169
	--trace)
		_G[trace]=true
		shift;;
	-V)
		setV "$2"
		shift 2;;
	-M)
		setM "$2"
		shift 2;;
	-G)
		setG $2
		shift 2;;
	*)
		setP $key
		shift;;
	esac
done

[ "${_G[trace]}"x == "true"x ] && set -x

note "Welcome to PanBook!"

# 修正目录
fixDir
mkDir

_call ${_G[func-pre]}_${_G[function]}
printGlobal
